#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include "head.h"
#include "create_mesh.h"
#include "finite_diff_method.h"
#include <mpi.h>

/**
 * @file   main.cpp
 * @author W. P. Yao <ywp@pku.edu.cn>
 * @date   2015年11月11日21:09:55
 * @brief  主函数
 */

int rank;                          // 进程号
int nprocs; 					   // 进程数

/**
 * 主函数
 *
 * @param argc main函数参数
 * @param argv main函数参数
 * @return     main函数返回值
 */

int main (int argc, char*argv[])
{
	MPI_Init(&argc, &argv);  
	MPI_Comm_size(MPI_COMM_WORLD, &nprocs); // 通信器中进程的数目
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);   // 通信器和进程号

	// 参数默认值
	int    N = 10;          // 区间分割数目
	int    N_Max = 10000;    // 最大计算步数
	double Tau_Ratio = 0.9; // 时间步长比例

	double Start, Finish_Mesh, Finish;
	
	// 参数输入值    
	if(argc > 1)
		N = atoi(argv[1]);
	if(argc > 2)
		N_Max = atoi(argv[2]);
	if(argc > 3)
		Tau_Ratio = atof(argv[3]);
	
	// 开始运算
	if(0 == rank){
		
	Start = clock();       // 记录开始时间

	Create_Mesh(N);         // 生成网格

	Finish_Mesh = clock(); // 记录完成网格生成时间

	printf("\n\t It took %f seconds to create meshes.\n",
		(double)(Finish_Mesh - Start)/CLOCKS_PER_SEC);
	                       // 打印结果到屏幕
	}
	
	MPI_Read_Mesh();
	//Read_Mesh(); 		   // 读取网格数据

	Set_Time_Step(0.0,Tau_Ratio,N_Max);
						   // 设置时间步长与计算步数
	
	Run();				   // 开始计算

	Finalize();			   // 计算结束
	
	if(0 == rank){
		
		Finish = clock();  // 记录完成计算时间
		printf("\n\t It took %f seconds to finish running.\n",
		(double)(Finish - Finish_Mesh)/CLOCKS_PER_SEC);
		}
	
	MPI_Finalize();        // 并行结束
	return 0;
}
